// api.js
import store from '@/store'; // 导入 Vuex Store

function getStoreValue(key) {
	return store.state[key]; // 通过 store.state 访问状态
}

const BASE_URL3 = 'http://47.98.55.203:80/prod-api'; // 开发
const BASE_URL = 'https://www.scivisco.com/prod-api'; // 正式
const BASE_URL2 ='https://test.scivisco.com/prod-api'; // 测试

async function request(options) {
	// uni.showLoading({
	// 	title: '加载中...' // 显示加载提示
	// });

	let tokenInfo = getStoreValue('tokenInfo')

	// 判断是否需要token
	const needsToken = options.needsToken !== false; // 默认需要token
	if (needsToken && (!tokenInfo || !tokenInfo.token || isTokenExpired(tokenInfo))) {
		try {
			// await refreshToken(); // 尝试刷新token
			tokenInfo = getStoreValue('tokenInfo')
		} catch (err) {
			console.error('刷新token失败:', err);
			throw new Error('无法获取有效的token');
		}
	}

	if (needsToken && tokenInfo && tokenInfo.token) {
		options.header = {
			...options.header,
			'token': tokenInfo.token
		};
	}

	return new Promise((resolve, reject) => {
		uni.request({
			...options,
			url: BASE_URL + options.url, // 拼接基础URL和接口路径
			success: (res) => {
				if (res.statusCode === 200) { // 根据实际情况判断请求是否成功
					resolve(res.data); // 成功回调
				} else {
					reject({
						code: res.statusCode,
						message: res.errMsg
					}); // 失败回调
				}
			},
			fail: (err) => {
				reject(err); // 请求失败回调
			},
			complete: () => {
				uni.hideLoading(); // 隐藏加载提示
			}
		});
	});
}

function isTokenExpired(tokenInfo) {
	const now = Date.now();
	return tokenInfo.expires_at && now > tokenInfo.expires_at;
}

async function refreshToken() {
	// 假设你有一个刷新token的接口
	const refreshResponse = await uni.request({
		url: `${BASE_URL}/wxtoken`, // 替换为实际的刷新token接口
		method: 'POST',
		data: {
			userInfo: getStoreValue('user')
		}
	});
	const {
		token
	} = refreshResponse.data.data; // 假设返回的数据结构
	const expires_in = 14400; //4小时
	const expires_at = Date.now() + (expires_in * 1000); // 计算过期时间
	let tokenData = {
		"token": token,
		"expires_at": expires_at
	};
	store.commit('setTokenInfo', tokenData);
}

export function get(url, data = {}, header = {}, needsToken = true) {
	return request({
		url: url,
		method: 'GET',
		data: data,
		header: header,
		needsToken: needsToken // 添加是否需要token的标识
	});
}

export function post(url, data = {}, header = {}, needsToken = true) {
	return request({
		url: url,
		method: 'POST',
		data: data,
		header: {
			'content-type': 'application/json', // 默认值
			...header
		},
		needsToken: needsToken // 添加是否需要token的标识
	});
}

export const baseUrl=BASE_URL;
// api.js

// 封装图片上传方法
export function uploadImage(file, data = {}, header = {}, needsToken = true, url = '/api/upload') {
	return new Promise(async (resolve, reject) => {
		// 获取 Token 信息
		let tokenInfo = getStoreValue('tokenInfo')

		// 判断是否需要 Token
		if (needsToken && (!tokenInfo || !tokenInfo.token || isTokenExpired(tokenInfo))) {
			try {
				// await refreshToken(); // 尝试刷新 Token
				tokenInfo = getStoreValue('tokenInfo');
			} catch (err) {
				console.error('刷新 Token 失败:', err);
				reject(new Error('无法获取有效的 Token'));
				return;
			}
		}

		// 设置请求头
		const finalHeader = {
			...header,
			'token': tokenInfo?.token, // 添加 Token 到请求头
			// 'content-type': 'multipart/form-data' // 图片上传需要 multipart/form-data
		};

		// 调用 uni.uploadFile 进行文件上传
		uni.uploadFile({
			url: BASE_URL + url, // 拼接基础 URL 和接口路径
			filePath: file, // 文件路径
			name: 'file', // 文件对应的 key，服务器端通过该 key 获取文件
			formData: data, // 其他表单数据
			header: finalHeader, // 请求头
			success: (res) => {
				if (res.statusCode === 200) { // 根据实际情况判断请求是否成功
					resolve(JSON.parse(res.data)); // 成功回调，解析返回的 JSON 数据
				} else {
					reject({
						code: res.statusCode,
						message: res.errMsg
					}); // 失败回调
				}
			},
			fail: (err) => {
				reject(err); // 请求失败回调
			},
			complete: () => {
				uni.hideLoading(); // 隐藏加载提示
			}
		});
	});
}
//eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3NDAyMTQwMDAsInVzZXJpZCI6Im51bGwiLCJ1c2VybmFtZSI6Im90MEgwNjN4V2VGT2V0bFQ1ZDZfZTJDajNJT0EifQ.WZ3QzjPg6g71ZpYX75Ml6kM4p8a17Gqtm5ABK_PhDTA
